u-boot: Merge ostree's and systems uEnv.txt
authorGatis Paeglis <gatis.paeglis@qt.io>
Tue, 23 Aug 2016 12:32:35 +0000 (14:32 +0200)
committerAtomic Bot <atomic-devel@projectatomic.io>
Sat, 27 Aug 2016 13:11:22 +0000 (13:11 +0000)
This is a proper fix for:
https://bugzilla.gnome.org/show_bug.cgi?id=755787

With this patch, an admin (system builder) can now:

1) Edit /usr/lib/ostree-boot/uEnv.txt
2) Deploy the new tree. OSTree will append system's uEnv.txt
   to the OSTree's managed uEnv.txt (loader/uEnv.txt).

It is common for u-boot systems to read in an extra env
from external /uEnv.txt. The same file OSTree uses to pass
in its env. With this patch /uEnv.txt now contains OSTree's
env + custom env added by system builders.

Closes: #466
Approved by: cgwalters

src/libostree/ostree-bootloader-uboot.c
tests/admin-test.sh
tests/test-admin-deploy-grub2.sh
tests/test-admin-deploy-syslinux.sh
tests/test-admin-deploy-uboot.sh

index f95ea8431e92969124d858e6bdea257a90281b7a..81ea95a6cda5ed1dfd32f10cadcca09d6c9cc8d8 100644 (file)
@@ -95,7 +95,45 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot     *self,
 
   val = ostree_bootconfig_parser_get (config, "options");
   if (val)
-    g_ptr_array_add (new_lines, g_strdup_printf ("bootargs=%s", val));
+    {
+      glnx_fd_close int uenv_fd = -1;
+      __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
+      const char *uenv_path = NULL;
+      const char *ostree_arg = NULL;
+
+      g_ptr_array_add (new_lines, g_strdup_printf ("bootargs=%s", val));
+
+      /* Append system's uEnv.txt, if it exists in $deployment/usr/lib/ostree-boot/ */
+      kargs = _ostree_kernel_args_from_string (val);
+      ostree_arg = _ostree_kernel_args_get_last_value (kargs, "ostree");
+      if (!ostree_arg)
+      {
+        g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                             "No ostree= kernel argument found in boot loader configuration file");
+        return FALSE;
+      }
+      ostree_arg += 1;
+      uenv_path = glnx_strjoina (ostree_arg, "/usr/lib/ostree-boot/uEnv.txt");
+      uenv_fd = openat (self->sysroot->sysroot_fd, uenv_path, O_CLOEXEC | O_RDONLY);
+      if (uenv_fd != -1)
+        {
+          char *uenv = glnx_fd_readall_utf8 (uenv_fd, NULL, cancellable, error);
+          if (!uenv)
+            {
+              g_prefix_error (error, "Reading %s: ", uenv_path);
+              return FALSE;
+            }
+          g_ptr_array_add (new_lines, uenv);
+        }
+      else
+        {
+          if (errno != ENOENT)
+            {
+              g_prefix_error (error, "openat %s: ", uenv_path);
+              return FALSE;
+            }
+        }
+    }
 
   return TRUE;
 }
index dcc34068a739c80a4ed4082166f23091fd1beeee..76fc8b85e78a30d7513a6cfb3df4c665986a1179 100755 (executable)
@@ -18,8 +18,6 @@
 
 set -euo pipefail
 
-echo "1..16"
-
 function validate_bootloader() {
     cd ${test_tmpdir};
     bootloader=""
index 6109a950a366f01ef5c881b371f5aac08dbb76dc..2b90c2866529e596524aa8352e9dd4955655646c 100755 (executable)
@@ -19,6 +19,8 @@
 
 set -euo pipefail
 
+echo "1..16"
+
 . $(dirname $0)/libtest.sh
 
 # Exports OSTREE_SYSROOT so --sysroot not needed.
index 419df2ba6378fbb877110b905f7b0b3988e29087..70b3b4d3e67f20738185a3877cb32043241f6b76 100755 (executable)
@@ -19,6 +19,8 @@
 
 set -euo pipefail
 
+echo "1..16"
+
 . $(dirname $0)/libtest.sh
 
 # Exports OSTREE_SYSROOT so --sysroot not needed.
index b998e0820e771fdbe09dddb92af29f9d29eeb044..d4c3a0dbf9349889e6638fa627e398a4034f6ca5 100755 (executable)
 
 set -euo pipefail
 
+echo "1..17"
+
 . $(dirname $0)/libtest.sh
 
 # Exports OSTREE_SYSROOT so --sysroot not needed.
 setup_os_repository "archive-z2" "uboot"
 
 . $(dirname $0)/admin-test.sh
+
+cd ${test_tmpdir}
+ln -s ../../boot/ osdata/usr/lib/ostree-boot
+cat << 'EOF' > osdata/boot/uEnv.txt
+loaduimage=load mmc ${bootpart} ${loadaddr} ${kernel_image}
+loadfdt=load mmc ${bootpart} ${fdtaddr} ${bootdir}${fdtfile}
+loadramdisk=load mmc ${bootpart} ${rdaddr} ${ramdisk_image}
+mmcargs=setenv bootargs $bootargs console=${console} ${optargs} root=${mmcroot} rootfstype=${mmcrootfstype}
+mmcboot=run loadramdisk; echo Booting from mmc ....; run mmcargs; bootz ${loadaddr} ${rdaddr} ${fdtaddr}
+EOF
+${CMD_PREFIX} ostree --repo=testos-repo commit --tree=dir=osdata/ -b testos/buildmaster/x86_64-runtime
+${CMD_PREFIX} ostree admin upgrade --os=testos
+assert_file_has_content sysroot/boot/uEnv.txt "loadfdt="
+assert_file_has_content sysroot/boot/uEnv.txt "kernel_image="
+
+echo "ok merging uEnv.txt files"